bvt_add_task(p);
- spin_lock_irqsave(&schedule_lock[p->processor], flags);
+ spin_lock_irqsave(&schedule_data[p->processor].schedule_lock, flags);
set_bit(DF_RUNNING, &p->flags);
if ( !__task_on_runqueue(RUNLIST(p)) )
__add_to_runqueue_head(RUNLIST(p), RUNQUEUE(p->processor));
- spin_unlock_irqrestore(&schedule_lock[p->processor], flags);
+ spin_unlock_irqrestore(&schedule_data[p->processor].schedule_lock, flags);
return 0;
}
if ( mcu_adv == 0 )
return -EINVAL;
- spin_lock_irqsave(&schedule_lock[p->processor], flags);
+ spin_lock_irqsave(&schedule_data[p->processor].schedule_lock, flags);
inf->mcu_advance = mcu_adv;
inf->warp = warp;
inf->warpl = warpl;
p->domain, inf->mcu_advance, inf->warp,
inf->warpl, inf->warpu );
- spin_unlock_irqrestore(&schedule_lock[p->processor], flags);
+ spin_unlock_irqrestore(&schedule_data[p->processor].schedule_lock, flags);
}
else if ( cmd->direction == SCHED_INFO_GET )
{
struct bvt_dom_info *inf = BVT_INFO(p);
- spin_lock_irqsave(&schedule_lock[p->processor], flags);
+ spin_lock_irqsave(&schedule_data[p->processor].schedule_lock, flags);
params->mcu_adv = inf->mcu_advance;
params->warp = inf->warp;
params->warpl = inf->warpl;
params->warpu = inf->warpu;
- spin_unlock_irqrestore(&schedule_lock[p->processor], flags);
+ spin_unlock_irqrestore(&schedule_data[p->processor].schedule_lock, flags);
}
return 0;
struct bvt_dom_info *d_inf;
struct domain *d;
- spin_lock_irqsave(&schedule_lock[i], flags);
+ spin_lock_irqsave(&schedule_data[i].schedule_lock, flags);
printk("svt=0x%08lX ", CPU_SVT(i));
queue = RUNQUEUE(i);
(unsigned long)list, (unsigned long)list->next,
(unsigned long)list->prev);
}
- spin_unlock_irqrestore(&schedule_lock[i], flags);
+ spin_unlock_irqrestore(&schedule_data[i].schedule_lock, flags);
}
/* We use cache to create the bvt_dom_infos
if(fbvt_alloc_task(p) < 0) return -1;
fbvt_add_task(p);
-//printk("< ----- >Initialising idle task for processor %d, address %d, priv %d\n", p->processor, (int)p, (int)p->sched_priv);
- spin_lock_irqsave(&schedule_lock[p->processor], flags);
+ spin_lock_irqsave(&schedule_data[p->processor].schedule_lock, flags);
set_bit(DF_RUNNING, &p->flags);
if ( !__task_on_runqueue(RUNLIST(p)) )
__add_to_runqueue_head(RUNLIST(p), RUNQUEUE(p->processor));
- spin_unlock_irqrestore(&schedule_lock[p->processor], flags);
+ spin_unlock_irqrestore(&schedule_data[p->processor].schedule_lock, flags);
return 0;
}
if ( mcu_adv == 0 )
return -EINVAL;
- spin_lock_irqsave(&schedule_lock[p->processor], flags);
+ spin_lock_irqsave(&schedule_data[p->processor].schedule_lock, flags);
inf->mcu_advance = mcu_adv;
inf->warp = warp;
inf->warpl = warpl;
p->domain, inf->mcu_advance, inf->warp,
inf->warpl, inf->warpu );
- spin_unlock_irqrestore(&schedule_lock[p->processor], flags);
+ spin_unlock_irqrestore(&schedule_data[p->processor].schedule_lock,
+ flags);
}
else if ( cmd->direction == SCHED_INFO_GET )
{
struct fbvt_dom_info *inf = FBVT_INFO(p);
- spin_lock_irqsave(&schedule_lock[p->processor], flags);
+ spin_lock_irqsave(&schedule_data[p->processor].schedule_lock, flags);
params->mcu_adv = inf->mcu_advance;
params->warp = inf->warp;
params->warpl = inf->warpl;
params->warpu = inf->warpu;
- spin_unlock_irqrestore(&schedule_lock[p->processor], flags);
+ spin_unlock_irqrestore(&schedule_data[p->processor].schedule_lock,
+ flags);
}
return 0;
struct fbvt_dom_info *next_prime_inf = NULL;
task_slice_t ret;
-//if(prev->sched_priv == NULL) printk("----> %d\n", prev->domain);
ASSERT(prev->sched_priv != NULL);
ASSERT(prev_inf != NULL);
next->min_slice = ctx_allow;
ret.task = next;
ret.time = r_time;
-//printk("NEXT --> domain %d (address %d, processor %d), priv %d\n",next->domain, (int)next, next->processor, (int)next->sched_priv);
return ret;
}
struct fbvt_dom_info *d_inf;
struct domain *d;
- spin_lock_irqsave(&schedule_lock[i], flags);
+ spin_lock_irqsave(&schedule_data[i].schedule_lock, flags);
printk("svt=0x%08lX ", CPU_SVT(i));
queue = RUNQUEUE(i);
(unsigned long)list, (unsigned long)list->next,
(unsigned long)list->prev);
}
- spin_unlock_irqrestore(&schedule_lock[i], flags);
+ spin_unlock_irqrestore(&schedule_data[i].schedule_lock, flags);
}
int cpu = d->processor;
s32 io_warp;
-//printk("-|--> Adding new domain %d\n",d->domain);
-//printk("-|--> Current%d (address %d, processor %d) %d\n",current->domain,(int)current, current->processor, (int)current->sched_priv);
/* If on the runqueue already then someone has done the wakeup work. */
if ( unlikely(__task_on_runqueue(RUNLIST(d))) )
return;
-//printk("----> Not on runqueue\n");
__add_to_runqueue_head(RUNLIST(d), RUNQUEUE(cpu));
-//printk(" ---> %d\n",(int)current->sched_priv);
now = NOW();
__calc_evt(inf);
curr = schedule_data[cpu].curr;
-//printk(" ---> %d\n",(int)current->sched_priv);
/* Currently-running domain should run at least for ctx_allow. */
min_time = curr->lastschd + curr->min_slice;
cpu_raise_softirq(cpu, SCHEDULE_SOFTIRQ);
else if ( schedule_data[cpu].s_timer.expires > (min_time + TIME_SLOP) )
mod_ac_timer(&schedule_data[cpu].s_timer, min_time);
-//printk(" ---> %d\n",(int)current->sched_priv);
}
struct scheduler sched_fbvt_def = {
if(rr_alloc_task(p) < 0) return -1;
rr_add_task(p);
- spin_lock_irqsave(&schedule_lock[p->processor], flags);
+ spin_lock_irqsave(&schedule_data[p->processor].schedule_lock, flags);
set_bit(DF_RUNNING, &p->flags);
if ( !__task_on_runqueue(RUNLIST(p)) )
__add_to_runqueue_head(RUNLIST(p), RUNQUEUE(p->processor));
- spin_unlock_irqrestore(&schedule_lock[p->processor], flags);
+ spin_unlock_irqrestore(&schedule_data[p->processor].schedule_lock, flags);
return 0;
}
int loop = 0;
struct rrobin_dom_info *d_inf;
- spin_lock_irqsave(&schedule_lock[i], flags);
+ spin_lock_irqsave(&schedule_data[i].schedule_lock, flags);
queue = RUNQUEUE(i);
printk("QUEUE rq %lx n: %lx, p: %lx\n", (unsigned long)queue,
d_inf = list_entry(list, struct rrobin_dom_info, run_list);
rr_dump_domain(d_inf->domain);
}
- spin_unlock_irqrestore(&schedule_lock[i], flags);
+ spin_unlock_irqrestore(&schedule_data[i].schedule_lock, flags);
}
(( ops.fn != NULL ) ? ops.fn( __VA_ARGS__ ) \
: (typeof(ops.fn(__VA_ARGS__)))0 )
-spinlock_t schedule_lock[NR_CPUS] __cacheline_aligned;
-
/* Per-CPU periodic timer sends an event to the currently-executing domain. */
static struct ac_timer t_timer[NR_CPUS];
unsigned long flags;
int cpu = d->processor;
- spin_lock_irqsave(&schedule_lock[cpu], flags);
+ spin_lock_irqsave(&schedule_data[cpu].schedule_lock, flags);
if ( likely(!domain_runnable(d)) )
SCHED_OP(sleep, d);
- spin_unlock_irqrestore(&schedule_lock[cpu], flags);
+ spin_unlock_irqrestore(&schedule_data[cpu].schedule_lock, flags);
/* Synchronous. */
while ( test_bit(DF_RUNNING, &d->flags) && !domain_runnable(d) )
{
unsigned long flags;
int cpu = d->processor;
- spin_lock_irqsave(&schedule_lock[cpu], flags);
+ spin_lock_irqsave(&schedule_data[cpu].schedule_lock, flags);
if ( likely(domain_runnable(d)) )
{
TRACE_2D(TRC_SCHED_WAKE, d->domain, d);
d->wokenup = NOW();
#endif
}
- spin_unlock_irqrestore(&schedule_lock[cpu], flags);
+ spin_unlock_irqrestore(&schedule_data[cpu].schedule_lock, flags);
}
/* Block the currently-executing domain until a pertinent event occurs. */
perfc_incrc(sched_run);
- spin_lock_irq(&schedule_lock[cpu]);
+ spin_lock_irq(&schedule_data[cpu].schedule_lock);
now = NOW();
schedule_data[cpu].s_timer.expires = now + r_time;
add_ac_timer(&schedule_data[cpu].s_timer);
- spin_unlock_irq(&schedule_lock[cpu]);
+ spin_unlock_irq(&schedule_data[cpu].schedule_lock);
/* Ensure that the domain has an up-to-date time base. */
if ( !is_idle_task(next) )
for ( i = 0; i < NR_CPUS; i++ )
{
- spin_lock_init(&schedule_lock[i]);
+ spin_lock_init(&schedule_data[i].schedule_lock);
schedule_data[i].curr = &idle0_task;
init_ac_timer(&schedule_data[i].s_timer);
typedef struct schedule_data_st
{
- struct domain *curr; /* current task */
- struct domain *idle; /* idle task for this cpu */
+ spinlock_t schedule_lock; /* spinlock protecting curr pointer
+ TODO check this */
+ struct domain *curr; /* current task */
+ struct domain *idle; /* idle task for this cpu */
void * sched_priv;
struct ac_timer s_timer; /* scheduling timer */
#ifdef BUCKETS
extern unsigned long wait_init_idle;
#define init_idle() clear_bit(smp_processor_id(), &wait_init_idle);
-extern spinlock_t schedule_lock[NR_CPUS] __cacheline_aligned;
-
#define set_current_state(_s) do { current->state = (_s); } while (0)
void scheduler_init(void);
void schedulers_start(void);